代码

架子包括:

项目结构

Multi-repo VS. Mono-repo

![[001.multi-repo vs mono-repo.excalidraw]]

一般 Mono-repo 的目录如下所示,在 packages 存放多个子项目,并且每个子项目都有自己的 package.json

├── packages
|   ├── pkg1
|   |   ├── package.json
|   ├── pkg2
|   |   ├── package.json
├── package.json

参考资料:现代前端工程为什么越来越离不开 Monorepo?

我们要实现的 React 分为很多包,如:reactreact-domreact-reconciler 等,它们关系密切,需要互相调用,所以采用 Mono-repo 组织项目。

Mono-repo 技术选型

简单工具:

专业工具:

pnpm 相比其他打包工具的优势:

参考资料:pnpm 是凭什么对 npm 和 yarn 降维打击的?

我们采用 pnpm 作为包管理工具,Mono-repo 落地选用 pnpm workspace

初始化项目

git init # 初始化 git 仓库

npm install -g pnpm
pnpm init # 创建 package.json

.gitignore

.DS_Store
node_modules
dist

初始化 pnpm-workspace.yaml

# pnpm-workspace.yaml

packages:
  - 'packages/*'

定义开发规范

lint 工具:ESLint

安装:pnpm i -D -w eslint

初始化:

pnpm exec eslint --init # 或:npx eslint --init

? How would you like to use ESLint?
# To check syntax and find problems
# ESLint 只做检查语法 + 发现问题,代码风格交给 Prettier

? What type of modules does your project use?
# JavaScript modules (import/export)

? Which framework does your project use?
# None of these

? Does your project use TypeScript?
# Yes

? Where does your code run?
# Browser ✅
# Node ✅

? Would you like to install them now?
# No
# 我们自己安装,因为它安装不加 -w,会报错

pnpm i -D -w globals @eslint/js typescript-eslint

生成的 eslint.config.mjs

import globals from 'globals'
import pluginJs from '@eslint/js'
import tsEslint from 'typescript-eslint'

export default [
  { languageOptions: { globals: { ...globals.browser, ...globals.node } } },
  pluginJs.configs.recommended,
  ...tsEslint.configs.recommended,
]

lint 增加对应的执行脚本:

"lint": "eslint --fix --quiet ./packages"

代码风格:Prettier

安装:pnpm i -D -w prettier

新建配置文件 .prettierrc.json

{
  "semi": false,
  "singleQuote": true,
  "printWidth": 120,
  "useTabs": false,
  "tabWidth": 2,
  "bracketSpacing": true,
  "trailingComma": "all",
  "arrowParens": "avoid"
}

style 增加对应的执行脚本:

"format": "prettier --write ./packages"

安装 Prettier 与 ESLint 的 VSCode 插件,并设置为保存后自动执行:Format On Save

commit 规范检查:CommitLint

通过 commitlintgit commit 提交信息进行检查,安装必要的库:

pnpm i -D -w @commitlint/cli @commitlint/config-conventional

新建配置文件 commitlint.config.mjs

export default {
  extends: ['@commitlint/config-conventional'],
}

conventional 规范集意义:

type(scope?): subject
# 类型(范围): 主题
# 范围是可选的,支持多个范围,用 "/"、"\"、"," 分割

type 值:

提交时自动运行

安装:pnpm i -D -w husky lint-staged

初始化 husky:

pnpm exec husky init

.husky/pre-commit

pnpm exec lint-staged

.husky/commit-msg

npx --no-install commitlint --edit "$1"

package.json

{
  "scripts": {
    "prepare": "husky",
    "lint": "eslint --fix --quiet ./packages",
    "format": "prettier --write ./packages"
  },
  "lint-staged": {
    "./packages/**/*.{js,jsx,ts,tsx}": [
      "prettier --write",
      "eslint --fix --quiet"
    ]
  },
}

打包工具

比较不同打包工具的区别,我们要开发的项目的特点:

所以选择 rollup,安装:pnpm i -D -w rollup

参考资料:Overview | Tooling.Report